// pages/login/login.js
const util = require('../../utils/util');
String.prototype.replaceAll = function (FindText, RepText) {
  return this.split(FindText).join(RepText);
};
const app = getApp();
import Toast from '../../miniprogram_npm/@vant/weapp/toast/toast';
import Base64 from '../../utils/Base64.js';
import CommonService from '../../utils/service/commonService.js';
const Common = require('../../utils/common');

Page({

  /**
   * 页面的初始数据
   */
  data: {
    //图片前缀
    prefix:'https://bangnizu.oss-cn-hangzhou.aliyuncs.com/bangni/images/',
    //logo图片
    logoUrl: app.globalData.logo,
    //背景
    bg:'',
    //背景索引
    bgIndex:1,
    //账号登录
    showAccount:true,
    //验证码登陆
    showCode:false,
    //输入框的值
    username:'',
    password:'',
    //手机号
    phone:'',
    //输入的验证码
    code:'',
    //正确的验证码
    rightCode:null,
    //发送验证码按钮文字
    sendBtnMsg:'发送验证码',
    //发送验证码按钮是否禁用
    disabledMsg: false,
    //查询验证码的参数
    bizId:'',
    //是否从报修页跳转来
    fromRepair:false,
    //是否从设备月度报表来的
    reportForm:false,
    //滑块遮罩层
    showSlide:false,
    //滑块通过验证
    showPassed:false,
    //滑块验证显示文字
    infoWords:'请按住滑块，拖动到最右边',
    //登录输入的信息
    inputObj:null,
    //切换账号
    showSwitch:false,
    //选择的账号
    radioAccount: '1',
    //账号列表
    accountList:[],
    //是否显示切换账号按钮
    showSwitchBtn:false,
    //是否是从公众号发送的报表来的
    reportSend:false,
    //是否是从公众号异常数据来的
    errorData:false,
    //是否是从公众号异常数据（内部人员用）来的
    errorInside:false,
    //是否是从保洁工单来的
    fromCleanWork:false,
    //是否是从公众号跳转低电列表来的
    equipmentElec:false,
    equipmentElecImei: [],
    //是否显示验证码登录
    showCodeLogin:true,
    //是否是密码类型
    isPass: true
  },

 /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.setData({
      //是否显示验证码登录
      showCodeLogin: app.globalData.showCodeLogin,
      //主题      
      bg: this.data.prefix+'login-bg-'+this.data.bgIndex+'.jpg'
    })
    
    //获取app的参数
    if(options.username && options.password){
      let inputObjs={
        userName: options.username,
        password: options.password
      }
      this.setData({
        inputObj: inputObjs
      })
      //token登录
      this.tokenLoginThisPage(inputObjs);
    }

    //退出
    if (options.from == 'quit') {
      app.globalData.userInfo = null;
    }

    //如果从公众号报修来的
    if (options.fromRepair) {
      this.setData({
        fromRepair: true
      })
    }

    //如果从设备月度报表来的
    if (options.reportForm) {
      this.setData({
        reportForm: true
      })
    }

    //如果从公众号发送的报表来的
    if (options.reportSend) {
      this.setData({
        reportSend: true
      })
    }

    //如果从公众号异常数据来的
    if (options.errorData) {
      this.setData({
        errorData: true
      })
    }

    //如果从公众号异常数据（内部人员用）来的
    if (options.errorInside) {
      this.setData({
        errorInside: true
      })
    }

    //如果从保洁工单来的
    if (options.fromCleanWork) {
      this.setData({
        fromCleanWork: true
      })
    }

    //从公众号低电列表来的
    if (options.equipmentElec) {
      this.setData({
        equipmentElec: true,
        equipmentElecImei: options.imei
      })
    }
    
    try {
      //取本地数据赋值给输入框
      let res = wx.getStorageSync('loginInputLast');
      if(res){
        this.setData({
          username: res.userName,
          password: res.password,
          showSwitchBtn:true
        })

        //直接登录
        if (options.from != 'quit') {
          let inputObjs={
            userName: res.userName,
            password: res.password
          }
          this.setData({
            inputObj: inputObjs
          })
          
          this.tokenLoginThisPage(inputObjs);          
        }

      }else{
        this.setData({
          showSwitchBtn:false
        })
      }
    } catch (e) {}
  },  

  //点击登录按钮
  onLogin: function (e) {
    let obj=e.detail.value;
    let username=obj.userName.trim();
    let password=obj.password;

    //判断非空
    if(username && password){
      obj.userName=username;
      this.setData({
        inputObj:obj
      })

      //判断输入框的值是否在本地缓存中
      let res = wx.getStorageSync('loginInputNew');
      if(res && res.length){
        let flag=false;
        flag=res.some((item)=>{
          return ((item.userName==username) && (item.password==password))
        });

        if(flag){
          //token登录
          this.tokenLoginThisPage(obj);

        }else{
          //滑动验证
          this.setData({
            showSlide: true
          })
        }
      }else{
        //滑动验证
        this.setData({
          showSlide: true
        })
      }

    }else{
      Toast.fail('请输入用户名或密码')
    }
  },

  //滑块结束滑动
  onTouchEnd(e){
    this.setData({
      showPassed: true,
      infoWords:'验证通过'
    })

    setTimeout(() => {
      this.setData({
        showSlide: false,
        showPassed:false,
        infoWords:'请按住滑块，拖动到最右边'
      })
      //token登录
      this.tokenLoginThisPage(this.data.inputObj);

    }, 500); 
  },

  //隐藏滑动验证
  onHideSlide(){
    this.setData({
      showSlide: false
    })
  },  

  //获取输入的手机号
  getPhone(e){
    this.setData({
      phone: e.detail.value.trim()
    })
  },

  //发送验证码
  sendCode(){
    Toast.loading({
      duration: 0,
      forbidClick: true,
      //message: '...'
    });

    let phone = this.data.phone;
    if(phone){
      //验证手机号
      if(util.checkPhoneFormat(phone)){
        //先验证是不是平台用户
        let flag=this.checkIsUser().then(value => {
          if(!value){
            Toast.fail('您的账号未注册，请联系管理员');
          }
          return value;
        });

        Promise.all([flag]).then(value => {
          let passed=value.every(val=>{
            return val;
          });

          if(passed){
            let parameter={
              personalPhone: phone,
              appId:[app.globalData.myAppId]
            }

            CommonService.sendSms(parameter).then(res=>{
              if(res.data.data){
                //查询验证码
                this.querySms(phone,res.data.data.bizId);
              }else{
                Toast.fail('抱歉出错了');
              }
            }).catch((error) => {
              Toast.fail('抱歉出错了');
            })
          }
        });

      }else{
        Toast.fail('手机号格式错误');
      }
    }else{
      Toast.fail('请输入手机号');
    }
  },

  //验证是不是平台用户
  checkIsUser(){
    let parameter={
      userName:this.data.phone
    }
    return new Promise((resolve, reject) => {
      CommonService.getUserName(parameter).then(res=>{
        if (res.data.success==true){
          resolve(true);
        } else {
          resolve(false);
        }
      }).catch((error) => {
        resolve(false);
      })
    });
  },

  //查询验证码
  querySms(phone,bizId){
    let parameter={
      personalPhone: phone,
      bizId:bizId
    }

    this.setData({
			bizId: bizId.replaceAll('^','=')
		})

    CommonService.querySms(parameter).then(res=>{
      Toast.clear();
      if(res.data.data){
        Toast.success('验证码已发送');

        console.log('验证码');
        console.log(res.data.data.code);

        this.setData({
          checkCode: res.data.data.code
        })

        //重新发送倒计时
        let time = null;
        let num = 60;

        time = setInterval(() => {
          num--;
          this.setData({
            disabledMsg:true,
            sendBtnMsg: num + '秒后重新发送'
          })
          if (num == 0) {
            clearInterval(time);
            this.setData({
              disabledMsg: false,
              sendBtnMsg: '发送验证码'
            })
          }
        }, 1000);
      }else{
        Toast.fail('抱歉出错了');
      }

    }).catch((error) => {
      Toast.fail('抱歉出错了');
    })
  },

  //提交表单-验证短信验证码
  onCodeLogin(e){
    let phone = this.data.phone;
    let sms = e.detail.value.code;

    if(phone){
      //验证手机号
      if(util.checkPhoneFormat(phone)){
        //先验证是不是平台用户
        let flag=this.checkIsUser().then(value => {
          if(!value){
            Toast.fail('您的账号未注册，请联系管理员');
          }
          return value;
        });

        Promise.all([flag]).then(value => {
          let passed=value.every(val=>{
            return val;
          });

          if(passed){
            if (sms) {
              if (sms == this.data.checkCode){
                //登录
                this.codeLoginToken();
              }else{
                Toast.fail('请输入正错的验证码');
              }
            }else{
              Toast.fail('请输入验证码');
            }
          }
        });
      }else{
        Toast.fail('手机号格式错误');
      }
    }else{
      Toast.fail('请输入手机号');
    }
  },

  //验证码登录
  codeLoginToken(){
    let _this=this;

    Toast.loading({
      duration: 0,
      forbidClick: true,
      message: '登录中...'
    });

    let auth = Base64.encode(app.globalData.appAccount);

    let authHeader = {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Authorization': 'Basic ' + auth
    };

    const loginInfo = "grant_type=phone_code" +
      "&phone=" + this.data.phone +
      "&code=" + this.data.checkCode+
      "&bizId=" + this.data.bizId;

    wx.request({
      url: app.globalData.tokenUrl,
      method:'post',
      header: authHeader,
      data: loginInfo,
      success:function(res){
        if(res.statusCode==200 && res.data.access_token){
          app.globalData.loginToken=res.data.access_token;
          console.log('token登录信息');
          console.log(res);

          //获取用户信息
          Common.loginUserName(
            _this.data.phone,
            {},
            _this.data.fromRepair,
            _this.data.reportForm,
            _this.data.reportSend,
            _this.data.errorData,
            _this.data.errorInside,
            _this.data.fromCleanWork,
            _this.data.fromPartsOrder);

        }else{
          Toast.fail(res.data.message);
        }  
      },
      fail(){
        Toast.fail('请求数据资源服务错误');
      }
    })
  },  

  //忘记密码
  goToPassword(){
    wx.navigateTo({
			url: "/pages/resetPassword/resetPassword"
		})
  },

  //显示切换账号
  onShowSwitch() {
    let loginInput = wx.getStorageSync('loginInputNew');
    this.setData({
      showSwitch: true,
      accountList:loginInput
    })
  },

  //隐藏切换账号
  onCloseSwitch() {
    this.setData({
      showSwitch: false
    })
  },

  //点击账号
  onClickAccount(e) {
    let obj=e.currentTarget.dataset.detail;
    this.setData({
      radioAccount: obj.userName,
      username: obj.userName,
      password: obj.password,
      inputObj: obj,
      isPass: true
    })
    this.onCloseSwitch();
  },

  //删除缓存的账号
  onDeleteAccount(e){
    let { username }=e.currentTarget.dataset;
    let arr = this.data.accountList;
    let newArr=[];
    
    arr.forEach(item => {
		  if (item.userName!=username){
        newArr.push(item);
		  }
		});
    this.setData({
      accountList: newArr
    })

    wx.setStorageSync("loginInputNew",newArr);

    if(!newArr.length){
      this.onCloseSwitch();
      this.setData({
        showSwitchBtn: false
      })
      wx.setStorageSync("loginInputLast",null);
    }
  },

  //点击验证码登陆
  onShowCode(){
    this.setData({ 
			showAccount:false,
      showCode:true
		})
  },

  //点击账号登陆
  onShowAccount(){
    this.setData({ 
			showAccount:true,
      showCode:false
		})
  },

  //是否显示密码
  onSwitchPass(){
    this.setData({ 
			isPass: !this.data.isPass
		})  
  },

  //token登录统一调用
  tokenLoginThisPage(obj){
		//token登录
    Common.tokenLogin(
      obj,
      this.data.fromRepair,
      this.data.reportForm,
      this.data.reportSend,
      this.data.errorData,
      this.data.errorInside,
      this.data.fromCleanWork,
      this.data.fromPartsOrder,
      this.data.equipmentElec,
      this.data.equipmentElecImei
    );
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})